#!/usr/bin/env python
# -*- coding: utf-8; -*-
from django import forms
from django.core.exceptions import ValidationError

from web.forms.bootstrap import BootstrapForm
from web.forms.widgets import ColorRadioSelect
from web import models


class ProjectModelForm(BootstrapForm, forms.ModelForm):
    # color 字段禁止 bootstrap 样式美化
    bootstrap_class_exclude = ['color']

    class Meta:
        model = models.Project
        fields = ['name', 'color', 'desc']

        # 下面的 widgets 字典中更改了 'color' 字段使用的显示插件,默认使用
        # forms.Select 对应的插件

        # class Select(ChoiceWidget):
        #     input_type = 'select'
        #     template_name = 'django/forms/widgets/select.html'
        #     option_template_name = 'django/forms/widgets/select_option.html'

        # 由上面的类属性可知,我们新定义的插件类同样应该指定 tempalte_name 和 option_tempalte_name
        # 请查看当前目录的 widgets.py

        widgets = {
            'desc': forms.Textarea,
            # 'color': forms.Select,  # 默认
            'color': ColorRadioSelect(attrs={'class': 'color-radio'}),
        }

    # 这儿的 __init__ 方法在视图中被调用，模型类实例化的form对象会具有
    # request属性，该属性 form.request 为 QuerySet 对象，更具体点为 <class
    # 'django.http.request.QueryDict'>
    def __init__(self, request, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.request = request

    # def clean_name(self):
    #     name = self.cleaned_data.get('name')
    #     print('name: ', name)
    #     raise ValidationError('mandatory')

    def clean_name(self):
        """ 项目校验 """
        name = self.cleaned_data['name']
        # 1. 当前用户是否已创建过此项目(项目名是否已存在)？
        exists = models.Project.objects.filter(
            name=name, creator=self.request.tracer.user).exists()
        if exists:
            raise ValidationError('项目名已存在')

        # 2. 当前用户是否还有额度进行创建项目？
        # 最多创建N个项目
        # self.request.tracer.package.project_num

        # 现在已创建多少项目？
        count = models.Project.objects.filter(
            creator=self.request.tracer.user).count()

        if count >= self.request.tracer.package.project_num:
            raise ValidationError('项目个数超限，请购买套餐')

        return name
